import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { visualizer } from 'rollup-plugin-visualizer'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ArcoResolver  } from 'unplugin-vue-components/resolvers'
import VueJSX from "@vitejs/plugin-vue-jsx"
import projectConfig from "./project.config"
import postcssConfig from "./postcss.config"

import viteCompression from 'vite-plugin-compression'

export default defineConfig({
  plugins: [
    vue(),
    VueJSX(),
    // 自动注册Vue3 hooks ，'vue', 'vue-router', 'vuex', 自动注册 arco-design
    AutoImport({
      imports: ['vue', 'vue-router' , 'vuex'],
      dts: 'src/autoImportVue.ts',
      resolvers: [
          ArcoResolver(
              {
                // 排除掉高德地图组件， 垃圾插件不知道为啥会去 arco-design 里面找 AMap
                exclude: ['AMap' , 'AMapLoader' , 'EasyPlayer'],
              }
          ),
      ],
    }),

    // UI 组件自动注册
    Components({
      directoryAsNamespace:true,
      resolvers: [
        ArcoResolver({
          sideEffect: true
        })
      ]
    }),

    visualizer({ open: true })
  ],
  babel: {
    plugins: [
      '@vue/babel-plugin-jsx',
    ],
  },
  css: {
    postcss: postcssConfig
  },
  build: {
    target: 'es2020',
    minify: 'terser',
    // rollup 配置
    rollupOptions: {
      output: {
        chunkFileNames: 'js/[name]-[hash].js', // 引入文件名的名称
        entryFileNames: 'js/[name]-[hash].js', // 包的入口文件名称
        assetFileNames: '[ext]/[name]-[hash].[ext]', // 资源文件像 字体，图片等
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return 'vendor'
          }
        }
      },
      plugins: [
        viteCompression({
          verbose: true, // 是否在控制台中输出压缩结果
          disable: false,
          threshold: 10240, // 如果体积大于阈值，将被压缩，单位为b，体积过小时请不要压缩，以免适得其反
          algorithm: 'gzip', // 压缩算法，可选['gzip'，' brotliccompress '，'deflate '，'deflateRaw']
          ext: '.gz',
          deleteOriginFile: false // 源文件压缩后是否删除
        })
      ]
    },
    terserOptions: {
      compress: {
        // 生产环境时移除console
        drop_console: true,
        drop_debugger: true
      }
    }
  },

  resolve: {
    alias: {
      ...projectConfig.alias
    },
    extensions: ['*', '.js', '.jsx', '.vue', '.less']
  },
  define: {
    'process.env': process.env,
  },
  server: {
    // 服务器启动时自动在浏览器打开
    open: true,
    // 服务器端口号
    port: projectConfig.port || 8081,

    // 服务器主机名
    host: projectConfig.host || 'localhost',

    // 是否启用 https
    https: false,
    // 开启热更新
    hmr: true,
    // 代理配置
    proxy: {
      ...projectConfig.proxy
    }
  }
})


